import os


# D:\python_www\tch01

# 给于一个源目录：D:\p_python\tch01\tch01
# 案例：需求： 把该目录（目录下面可能还有子目录）中所有.py文件拷贝到另外一个指定的目录中

def copy_dir(source_dir, destination_dir):
    """
    拷贝一个文件夹中所有的.py文件（包含子目录中包含.py文件的子目录)
    :param source_dir: 源目录
    :param destination_dir:  目标目录
    :return:
    """

    for f in os.listdir(source_dir):  # f代表源目录下的每个文件（目录）的名字
        file_path = os.path.join(source_dir, f)
        if os.path.isfile(file_path) and file_path.endswith('.py'):  # 如果是一个文件，获取拓展名，是否是.py结尾的
            # 拷贝该文件
            # 考虑目标目录是否存在，此时需要创建多个目录的函数
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)
            # 拼凑一个拷贝好之后的目标文件路径
            sink_path = os.path.join(destination_dir, f)
            copy_file(file_path, sink_path)
        elif os.path.isdir(file_path):
            # 采用递归函数的写法
            # 为了保持同样的目录结构， 目标目录要跟着变化
            new_destination_path = os.path.join(destination_dir, f)
            copy_dir(file_path, new_destination_path)


def copy_file(source_file, sink_file):
    """
    拷贝单个文件到目标文件
    :param source_file: 源文件
    :param sink_file: 目标文件
    :return:
    """

    # 第一种：源文件是小文件，一次下读取出来，写入到目标文件
    # with open(source_file, mode='r', encoding='utf-8') as source_f:
    #     contents = source_f.read()
    #     with open(sink_file, mode='w', encoding='utf-8') as sink_f:
    #         sink_f.write(contents)

    # 第二种：源文件是大文件，分批读取出来写入到目标文件，（加入单个文件大于100MB
    source_f = open(source_file, mode='r', encoding='utf-8')
    sink_f = open(sink_file, mode='w', encoding='utf-8')

    while True:
        content = source_f.read(1024 * 10)  # 每次读取10KB
        if content == '' or content is None:
            break
        sink_f.write(content)
    source_f.close()
    sink_f.close()
    return


copy_dir(r'D:\source_python', r'D:\dis_python1')
